﻿using JIESHINet.Common.Option;
using Microsoft.Extensions.DependencyInjection;

namespace JIESHINet.Extension.Option
{
    /// <summary>
    /// 提供一种方便的方式，将所有实现了 <see cref="IConfigurableOptions"/> 接口的选项类型注册到服务集合中。
    /// </summary>
    public static class AllOptionRegister
    {
        /// <summary>
        /// 将所有选项类型注册到服务集合中。
        /// </summary>
        /// <param name="services">服务集合，用于注册选项配置服务。</param>
        /// <exception cref="ArgumentNullException">如果服务集合为 null，则抛出参数异常。</exception>
        public static void AddAllOptionRegister(this IServiceCollection services)
        {
            // 检查服务集合是否为 null，如果为 null 则抛出参数异常
            if (services == null) throw new ArgumentNullException(nameof(services));
            // 遍历JIESHINet.Commonc程序集中所有非ConfigurableOptions且实现了 IConfigurableOptions 接口的类型
            foreach (var optionType in typeof(ConfigurableOptions).Assembly.GetTypes().Where(s =>
                         !s.IsInterface && typeof(IConfigurableOptions).IsAssignableFrom(s)))
            {
                // 将每个选项类型添加到服务集合中
                services.AddConfigurableOptions(optionType);
            }
        }
    }
}
